package com.boot2.core.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author malongbo
 */
@Deprecated
public final class FileUtils {

	/**
	 * 获取文件扩展名*
	 * 
	 * @param fileName
	 *            文件名
	 * @return 扩展名
	 */
	public static String getExtension(String fileName) {
		int i = fileName.lastIndexOf(".");
		if (i < 0) {
			return null;
		}

		return fileName.substring(i + 1);
	}

	/**
	 * 获取文件扩展名*
	 * 
	 * @param file
	 *            文件对象
	 * @return 扩展名
	 */
	public static String getExtension(File file) {
		if (file == null) {
			return null;
		}

		if (file.isDirectory()) {
			return null;
		}

		String fileName = file.getName();
		return getExtension(fileName);
	}

	/**
	 * 读取文件*
	 * 
	 * @param filePath
	 *            文件路径
	 * @return 文件对象
	 */
	public static File readFile(String filePath) {
		File file = new File(filePath);
		if (file.isDirectory()) {
			return null;
		}

		if (!file.exists()) {
			return null;
		}

		return file;
	}

	/**
	 * 复制文件
	 * 
	 * @param oldFilePath
	 *            源文件路径
	 * @param newFilePath
	 *            目标文件毒经
	 * @return 是否成功
	 */
	public static boolean copyFile(String oldFilePath, String newFilePath) {
		try {
			int byteRead = 0;
			File oldFile = new File(oldFilePath);
			if (oldFile.exists()) { // 文件存在时
				InputStream inStream = new FileInputStream(oldFilePath); // 读入原文件
				FileOutputStream fs = new FileOutputStream(newFilePath);
				byte[] buffer = new byte[1444];
				while ((byteRead = inStream.read(buffer)) != -1) {
					fs.write(buffer, 0, byteRead);
				}
				inStream.close();
				fs.close();
				return true;
			}
			return false;
		} catch (Exception e) {
			System.out.println("复制单个文件操作出错 ");
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 删除文件
	 * 
	 * @param filePath
	 *            文件地址
	 * @return 是否成功
	 */
	public static boolean delFile(String filePath) {
		return delFile(new File(filePath));
	}

	/**
	 * 删除文件
	 * 
	 * @param file
	 *            文件对象
	 * @return 是否成功
	 */
	public static boolean delFile(File file) {
		if (file.exists()) {
			return file.delete();
		}
		return false;
	}

	/**
	 * png图片转jpg*
	 * 
	 * @param pngImage
	 *            png图片对象
	 * @param jpegFile
	 *            jpg图片对象
	 * @return 转换是否成功
	 */
	public static boolean png2jpeg(File pngImage, File jpegFile) {
		BufferedImage bufferedImage;

		try {
			bufferedImage = ImageIO.read(pngImage);

			BufferedImage newBufferedImage = new BufferedImage(bufferedImage.getWidth(), bufferedImage.getHeight(),
					BufferedImage.TYPE_INT_RGB);

			newBufferedImage.createGraphics().drawImage(bufferedImage, 0, 0, Color.WHITE, null);

			ImageIO.write(bufferedImage, "jpg", jpegFile);

			return true;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 判断文件是否是图片*
	 * 
	 * @param imgFile
	 *            文件对象
	 * @return
	 */
	public static boolean isImage(File imgFile) {
		try {
			BufferedImage image = ImageIO.read(imgFile);
			return image != null;
		} catch (IOException e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 判断文件是否是视频*
	 * 
	 * @param videoFile
	 *            文件对象
	 * @return
	 */
	public static boolean isVideo(File videoFile) {
		try {

			FileType type = getType(videoFile);

			return type == FileType.AVI || type == FileType.RAM || type == FileType.RM || type == FileType.MOV
					|| type == FileType.ASF || type == FileType.MPG;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 根据系统当前时间，返回时间层次的文件夹结果，如：upload/2015/01/18/0.jpg
	 * 
	 * @return
	 */
	public static String getTimeFilePath() {
		return new SimpleDateFormat("/yyyy/MM/dd").format(new Date()) + "/";
	}

	/**
	 * 将文件头转换成16进制字符串
	 *
	 * @param src
	 *            原生byte
	 * @return 16进制字符串
	 */
	private static String bytesToHexString(byte[] src) {

		StringBuilder stringBuilder = new StringBuilder();
		if (src == null || src.length <= 0) {
			return null;
		}
		for (int i = 0; i < src.length; i++) {
			int v = src[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}

	/**
	 * 得到文件头
	 *
	 * @param file
	 *            文件
	 * @return 文件头
	 * @throws IOException
	 */
	private static String getFileContent(File file) throws IOException {

		byte[] b = new byte[28];

		InputStream inputStream = null;

		try {
			inputStream = new FileInputStream(file);
			inputStream.read(b, 0, 28);
		} catch (IOException e) {
			e.printStackTrace();
			throw e;
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
					throw e;
				}
			}
		}
		return bytesToHexString(b);
	}

	/**
	 * 判断文件类型
	 *
	 * @param file
	 *            文件
	 * @return 文件类型
	 */
	public static FileType getType(File file) throws IOException {

		String fileHead = getFileContent(file);

		if (fileHead == null || fileHead.length() == 0) {
			return null;
		}

		fileHead = fileHead.toUpperCase();

		FileType[] fileTypes = FileType.values();

		for (FileType type : fileTypes) {
			if (fileHead.startsWith(type.getValue())) {
				return type;
			}
		}

		return null;
	}

}
